package zisu.netty.practice.netty.codec;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * @Desc: ""
 * @Author: caixiang
 * @DATE: 2020/7/8 10:12
 */

/**
 * ChannelInboundHandlerAdapter 是Handler 入栈的适配器
 * 说明：
 * 1.我们自定义一个Handler 需要继承netty 规定好的某个HandlerAdapter
 * 2.这时我们自定义一个Handler ，才能称为一个Handler
 * */

public class NettyServerHandler extends SimpleChannelInboundHandler<StudentPOJO.Student> {
    /**
     * 读取数据事件（这里可以读取客户端发送的消息），，当客户端有消息过来的时候，netty会自动的把 消息传递给pipline关联的Handler上
     * 1.ChannelHandlerContext ctx 上下文对象，含有管道pipline（里边包含多个Handler，对管道里面的数据进行处理），通道channel（主要是对数据进行读写）
     * 2.Object msg 就是客户端发送过来的数据，默认Object
     * */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, StudentPOJO.Student msg) throws Exception {
        //读取客户端发送的StudentPojo.Student
        StudentPOJO.Student student = (StudentPOJO.Student) msg;
        System.out.println("客户端发送的数据 id="+student.getId()+",name="+student.getName());
    }

    //读取数据完毕后执行的方法
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //把数据写到一个缓存，，并且把这个缓存 打到 channel里面去
        //一般来讲，我们对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端！",CharsetUtil.UTF_8));
    }

    //处理异常，，一般是需要关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
